package pl.edu.mimuw.mas.util;

import jade.core.AID;

import java.awt.Color;
import java.util.HashMap;
import java.util.Random;
import java.util.Map.Entry;

public final class GroupHelper {
	
	/**
	 * Współczynnik określający rozmiar grupy. Im większy
	 * tym mniejsza powierzchniowo grupa. Parametr trzeba
	 * dobierać doświadczalnie do rozmiaru planszy i liczby
	 * agentów.
	 */
	public static final double groupingFactor = 1d / 80d;
//	public static final double groupingFactor = 1d;
	
	private static HashMap<AID, Color> colors = new HashMap<AID, Color>();
	
	/**
	 * Zwraca kolor (tablica z r, g, b) dla grupy, której liderem jest <code>leader</code>
	 * @param leader AID lidera grupy
	 */
	public static Color getGroupColor(AID leader) {
		if (!colors.containsKey(leader)) {
			colors.put(leader, generateNewColor());
		}
		return colors.get(leader);
	}
	
	/**
	 * Generuje nowy kolor
	 */
	private static Color generateNewColor() {
		Random rnd = new Random();
		
		Color ret;
		do {
			int r = 60 * rnd.nextInt(4);
			int g = 60 * rnd.nextInt(4);
			int b = 60 * rnd.nextInt(4);
			ret = new Color(r, g, b);
		} while (isGreyish(ret) && !isNewColor(ret));
			
		return ret;
	}
	
	/**
	 * Sprawdza czy dany kolor juz byla komus nadany
	 * @param c kolor do sprawdzenia
	 * @return prawda jeśli jest to nowy kolor
	 */
	private static boolean isNewColor(Color c) {
		for (Entry<AID, Color> entry : colors.entrySet()) {
			if (entry.getValue().equals(c)) {
				return false;
			}
		}
		return true;
	}
	
	/**
	 * Checkes if color is greyish
	 * @param c color to check
	 * @return true if it is similar
	 */
	private static boolean isGreyish(Color c) {
		return Math.abs(128 - c.getRed()) < 32 &&
			Math.abs(128 - c.getGreen()) < 32 &&
			Math.abs(128 - c.getBlue()) < 32;
	}

}
